﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SMA.GENTEv1.Dados;

namespace SMA.GENTEv1
{
    public class PessoaDocTituloEleitor
    {
        #region Variaveis Membro
        private int _idTituloEleitor;
        private int _idPessoa;
        private TipoTituloEleitor _tipoTitulo;
        private string _numero;
        private string _zona;
        private string _secao;
        private Uf _uf;
        private DateTime _dataExpedicao;
        private string _path;
        private GENTEEntities _context;
        #endregion

        #region Parametros
        public int IdTituloEleitor
        {
            get { return _idTituloEleitor; }
            set { _idTituloEleitor = value; }
        }
        public int IdPessoa
        {
            get { return _idPessoa; }
            set { _idPessoa = value; }
        }
        public TipoTituloEleitor TipoTitulo
        {
            get { return _tipoTitulo; }
            set { _tipoTitulo = value; }
        }
        public string Numero
        {
            get { return _numero; }
            set { _numero = value; }
        }
        public string Zona
        {
            get { return _zona; }
            set { _zona = value; }
        }
        public string Secao
        {
            get { return _secao; }
            set { _secao = value; }
        }
        public Uf Uf
        {
            get { return _uf; }
            set { _uf = value; }
        }
        public DateTime DataExpedicao
        {
            get { return _dataExpedicao; }
            set { _dataExpedicao = value; }
        }
        public string Path
        {
            get { return _path; }
            set { _path = value; }
        }
        #endregion

        #region Construtores
        public PessoaDocTituloEleitor()
        {
            try
            {
                _context = new GENTEEntities();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public PessoaDocTituloEleitor(int idTituloEleitor)
        {
            try
            {
                _context = new GENTEEntities();
                Carregar(idTituloEleitor);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Privados
        protected void Carregar(int idTituloEleitor)
        {
            try
            {
                var consulta = from tt in _context.tab_pessoa_documento_titulo_eleitor
                               where tt.id_pessoa_titulo_eleitor == idTituloEleitor
                               select new
                               {
                                   tt.id_pessoa_titulo_eleitor,
                                   tt.tab_pessoa.Id_pessoa,
                                   tt.tab_tipo_titulo_eleitor.id_tipo_titulo_eleitor,
                                   tt.numero,
                                   tt.zona_eleitoral,
                                   tt.secao,
                                   tt.id_uf,
                                   tt.dt_expedicao,
                                   tt.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this.IdTituloEleitor = list.id_pessoa_titulo_eleitor;
                    this.IdPessoa = list.Id_pessoa;
                    this.TipoTitulo = new TipoTituloEleitor(list.id_tipo_titulo_eleitor);
                    this.Numero = list.numero;
                    this.Zona = list.zona_eleitoral;
                    this.Secao = list.secao;
                    this.Uf = new Uf(list.id_uf);
                    this.DataExpedicao = list.dt_expedicao;
                    this.Path = list.path;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        protected void RecuperaId()
        {
            try
            {
                var consulta = from tt in _context.tab_pessoa_documento_titulo_eleitor
                               where tt.tab_pessoa.Id_pessoa == this.IdPessoa
                               && tt.tab_tipo_titulo_eleitor.id_tipo_titulo_eleitor == this.TipoTitulo.IdTipoTituloEleitor
                               && tt.numero == this.Numero
                               && tt.zona_eleitoral == this.Zona
                               && tt.secao == this.Secao
                               orderby tt.id_pessoa_titulo_eleitor descending
                               select tt;

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this.IdTituloEleitor = list.id_pessoa_titulo_eleitor;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Publicos

        #region Metodos de Selecao
        public List<PessoaDocTituloEleitor> SelectAll()
        {
            try
            {
                List<PessoaDocTituloEleitor> listPessoaDocTituloEleitor = new List<PessoaDocTituloEleitor>();

                var consulta = from tt in _context.tab_pessoa_documento_titulo_eleitor
                               select new
                               {
                                   tt.id_pessoa_titulo_eleitor,
                                   tt.tab_pessoa.Id_pessoa,
                                   tt.tab_tipo_titulo_eleitor.id_tipo_titulo_eleitor,
                                   tt.numero,
                                   tt.zona_eleitoral,
                                   tt.secao,
                                   tt.id_uf,
                                   tt.dt_expedicao,
                                   tt.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    PessoaDocTituloEleitor tituloEleitor = new PessoaDocTituloEleitor();
                    tituloEleitor.IdTituloEleitor = list.id_pessoa_titulo_eleitor;
                    tituloEleitor.IdPessoa = list.Id_pessoa;
                    tituloEleitor.TipoTitulo = new TipoTituloEleitor(list.id_tipo_titulo_eleitor);
                    tituloEleitor.Numero = list.numero;
                    tituloEleitor.Zona = list.zona_eleitoral;
                    tituloEleitor.Secao = list.secao;
                    tituloEleitor.Uf = new Uf(list.id_uf);
                    tituloEleitor.DataExpedicao = list.dt_expedicao;
                    tituloEleitor.Path = list.path;

                    listPessoaDocTituloEleitor.Add(tituloEleitor);
                }

                return listPessoaDocTituloEleitor;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<PessoaDocTituloEleitor> SelectPorPessoa(int idPessoa)
        {
            try
            {
                List<PessoaDocTituloEleitor> listPessoaDocTituloEleitor = new List<PessoaDocTituloEleitor>();

                var consulta = from tt in _context.tab_pessoa_documento_titulo_eleitor
                               where tt.tab_pessoa.Id_pessoa == idPessoa
                               select new
                               {
                                   tt.id_pessoa_titulo_eleitor,
                                   tt.tab_pessoa.Id_pessoa,
                                   tt.tab_tipo_titulo_eleitor.id_tipo_titulo_eleitor,
                                   tt.numero,
                                   tt.zona_eleitoral,
                                   tt.secao,
                                   tt.id_uf,
                                   tt.dt_expedicao,
                                   tt.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    PessoaDocTituloEleitor tituloEleitor = new PessoaDocTituloEleitor();
                    tituloEleitor.IdTituloEleitor = list.id_pessoa_titulo_eleitor;
                    tituloEleitor.IdPessoa = list.Id_pessoa;
                    tituloEleitor.TipoTitulo = new TipoTituloEleitor(list.id_tipo_titulo_eleitor);
                    tituloEleitor.Numero = list.numero;
                    tituloEleitor.Zona = list.zona_eleitoral;
                    tituloEleitor.Secao = list.secao;
                    tituloEleitor.Uf = new Uf(list.id_uf);
                    tituloEleitor.DataExpedicao = list.dt_expedicao;
                    tituloEleitor.Path = list.path;

                    listPessoaDocTituloEleitor.Add(tituloEleitor);
                }

                return listPessoaDocTituloEleitor;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos de Persistencia
        public void Salvar()
        {
            try
            {
                if (this.IdTituloEleitor == 0)
                {
                    tab_pessoa_documento_titulo_eleitor tabTitulo = new tab_pessoa_documento_titulo_eleitor();
                    tabTitulo.tab_pessoaReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_pessoa", "Id_pessoa", this.IdPessoa);
                    tabTitulo.tab_tipo_titulo_eleitorReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_titulo_eleitor", "id_tipo_titulo_eleitor", this.TipoTitulo.IdTipoTituloEleitor);
                    tabTitulo.numero = this.Numero;
                    tabTitulo.zona_eleitoral = this.Zona;
                    tabTitulo.secao = this.Secao;
                    tabTitulo.id_uf = this.Uf.IdUf;
                    tabTitulo.dt_expedicao = this.DataExpedicao;

                    _context.AddTotab_pessoa_documento_titulo_eleitor(tabTitulo);
                    _context.SaveChanges();

                    RecuperaId();
                }
                else
                {
                    tab_pessoa_documento_titulo_eleitor tabTitulo = (from tt in _context.tab_pessoa_documento_titulo_eleitor
                                                                     where tt.id_pessoa_titulo_eleitor == this.IdTituloEleitor
                                                                     select tt).First();

                    tabTitulo.tab_pessoaReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_pessoa", "Id_pessoa", this.IdPessoa);
                    tabTitulo.tab_tipo_titulo_eleitorReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_titulo_eleitor", "id_tipo_titulo_eleitor", this.TipoTitulo.IdTipoTituloEleitor);
                    tabTitulo.numero = this.Numero;
                    tabTitulo.zona_eleitoral = this.Zona;
                    tabTitulo.secao = this.Secao;
                    tabTitulo.id_uf = this.Uf.IdUf;
                    tabTitulo.dt_expedicao = this.DataExpedicao;

                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void AtualizaPath()
        {
            try
            {
                if (this.IdTituloEleitor != 0)
                {
                    tab_pessoa_documento_titulo_eleitor tabTitulo = (from tt in _context.tab_pessoa_documento_titulo_eleitor
                                                                     where tt.id_pessoa_titulo_eleitor == this.IdTituloEleitor
                                                                     select tt).First();

                    tabTitulo.path = this.Path;

                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #endregion
    }
}
